#include <iostream>
#include <string>
#include <cstring>

#include <benchmark/benchmark.h>

using namespace std;

void demo()
{
    string str = "hello world";
    str.size();
}

/**
 * 第一列是程序名称，第二列是平均迭代一次的时钟时间，
 * 第三列是平均迭代一次的CPU时间，第四列是循环的迭代次数。
 * 时钟时间 = 阻塞时间 + 就绪时间 + 运行时间（也就是CPU时间）
**/
static void BM_demo(benchmark::State& state) {
    for (auto _ : state)
        demo();
}

//通过传递参数，我们可以测试memcpy函数在不同内存大小情况下的执行效率
static void BM_memcpy(benchmark::State& state) {
	cout << "state.range[0]:" << state.range(0) << endl;
	char* src = new char[state.range(0)];
	char* dst = new char[state.range(0)];

	//拷贝8字节，64字节，512字节，1024字节, 8192字节
	memset(src, 'x', state.range(0));

	for (auto _ : state)
		memcpy(dst, src, state.range(0));
	state.SetBytesProcessed(int64_t(state.iterations()) * int64_t(state.range(0)));
	delete[] src;
	delete[] dst;

}

// Register the function as a benchmark
// Iterations:指定迭代此时
// Arg: 指定参数
//BENCHMARK(BM_demo)->Iterations(1000000); //用于注册测试函数
//BENCHMARK(BM_memcpy)->Iterations(1000000)->Arg(8)->Arg(64)->Arg(512)->Arg(1024)->Arg(81928);
BENCHMARK(BM_demo);
BENCHMARK(BM_memcpy)->Arg(8)->Arg(64)->Arg(512)->Arg(1024)->Arg(8192);

BENCHMARK_MAIN(); //程序入口

